{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color='green'> MNIST - Clustering (Dense Matrix)<font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <font color='green'> 1. Description<font>\n",
    "\n",
    "Clustering using MNIST Digit Recognition dataset.\n",
    "Dataset is downloaded from tensorflow by using `tensorflow.keras.datasets.mnist.load_data()` method; so please install tensorflow.\n",
    "\n",
    "The MNIST database (Modified National Institute of Standards and Technology database) is a large database of handwritten digits that is commonly used for training various image processing systems. In this demo we will use this dataset to correctly cluster similar digits."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <font color='green'> 2. Data Preprocessing<font>\n",
    "\n",
    "For MNIST Digits dataset we will perform some data preparation and data cleaning steps."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%capture\n",
    "import os\n",
    "import time\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from sklearn import metrics\n",
    "from collections import OrderedDict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def preprocess_data():\n",
    "    '''\n",
    "    Load the mnist data and perform pre-processing\n",
    "    '''\n",
    "    # Load MNIST Digits dataset\n",
    "    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()\n",
    "    x = np.concatenate((x_train, x_test))\n",
    "    y = np.concatenate((y_train, y_test))\n",
    "    x = x.reshape((x.shape[0], -1)).astype('float32')\n",
    "    x = np.divide(x, 255.)\n",
    "    return x, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset contains (70000, 784) samples\n",
      "Dataset contains 10 classes\n"
     ]
    }
   ],
   "source": [
    "#---- Data Loading and Preparation ----\n",
    "\n",
    "X, y = preprocess_data()\n",
    "n_clusters = len(np.unique(y))\n",
    "print(\"Dataset contains {} samples\".format(X.shape))\n",
    "print(\"Dataset contains {} classes\".format(n_clusters))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Label distribution summary\n",
    "import matplotlib.pyplot as plt\n",
    "val, count = np.unique(y, return_counts=True)\n",
    "label = np.asarray((val, count)).T\n",
    "labels_df = pd.DataFrame(data=label)\n",
    "ax = labels_df[1].plot(kind='bar', title='Label Distribution').\\\n",
    "     set(xlabel=\"Digit\", ylabel=\"Count of digit images\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(X[0].reshape(28, 28), cmap = 'binary')\n",
    "plt.title('Digit Label = {}'.format(y[0]))\n",
    "plt.show()\n",
    "plt.imshow(X[1000].reshape(28, 28), cmap = 'magma')\n",
    "plt.title('Digit Label = {}'.format(y[1000]))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <font color='green'> 3. Algorithm Evaluation<font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_time = []\n",
    "homogeneity = []\n",
    "algo = []\n",
    "ml_framework = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate(estimator, algo_nm, framework_nm, X, y):\n",
    "    '''\n",
    "    To generate performance report for both frovedis and sklearn estimators\n",
    "    '''\n",
    "    algo.append(algo_nm)\n",
    "    ml_framework.append(framework_nm)\n",
    "    \n",
    "    start_time = time.time()\n",
    "    y_pred = estimator.fit_predict(X)\n",
    "    train_time.append(round(time.time() - start_time, 4))\n",
    "\n",
    "    homogeneity.append(metrics.homogeneity_score(y, y_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.1 KMeans Clustering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frovedis KMeans train time: 0.493 sec\n",
      "scikit-learn KMeans train time: 1.696 sec\n"
     ]
    }
   ],
   "source": [
    "#Demo: KMeans Clustering\n",
    "import frovedis\n",
    "TARGET = \"kmeans\"\n",
    "from frovedis.exrpc.server import FrovedisServer\n",
    "FrovedisServer.initialize(\"mpirun -np 8 \" + os.environ[\"FROVEDIS_SERVER\"])\n",
    "from frovedis.mllib.cluster import KMeans as frovKM\n",
    "f_est = frovKM(n_clusters=n_clusters, init='random', algorithm='full', random_state=123, n_init=1)\n",
    "evaluate(f_est, TARGET, \"frov_\" + frovedis.__version__, X, y)\n",
    "f_est.release()\n",
    "FrovedisServer.shut_down()\n",
    "print(\"Frovedis KMeans train time: %.3f sec\" % train_time[0])\n",
    "\n",
    "import sklearn\n",
    "from sklearn.cluster import KMeans as skKM\n",
    "s_est = skKM(n_clusters=n_clusters, init='random', algorithm='full', random_state=123, n_init=1)\n",
    "evaluate(s_est, TARGET, \"skl_\" + sklearn.__version__, X, y)\n",
    "print(\"scikit-learn KMeans train time: %.3f sec\" % train_time[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2 Agglomerative Clustering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frovedis AgglomerativeClustering train time: 16.789 sec\n",
      "scikit-learn AgglomerativeClustering train time: 300.678 sec\n"
     ]
    }
   ],
   "source": [
    "#Demo: Agglomerative Clustering\n",
    "import frovedis\n",
    "TARGET = \"agglomerative\"\n",
    "from frovedis.exrpc.server import FrovedisServer\n",
    "FrovedisServer.initialize(\"mpirun -np 8 \" + os.environ[\"FROVEDIS_SERVER\"] )\n",
    "from frovedis.mllib.cluster import AgglomerativeClustering as frovAgglomerative\n",
    "\n",
    "# for Agglomerative performed PCA decomposition\n",
    "from frovedis.mllib.decomposition import PCA\n",
    "x_pca = PCA(n_components=100).fit_transform(X)\n",
    "\n",
    "f_est = frovAgglomerative(n_clusters=n_clusters, linkage=\"average\")\n",
    "evaluate(f_est, TARGET, \"frov_\" + frovedis.__version__, x_pca, y)\n",
    "f_est.release()\n",
    "FrovedisServer.shut_down()\n",
    "print(\"Frovedis AgglomerativeClustering train time: %.3f sec\" % train_time[2])\n",
    "\n",
    "import sklearn\n",
    "from sklearn.cluster import AgglomerativeClustering as skAgglomerative\n",
    "s_est = skAgglomerative(n_clusters=n_clusters, linkage=\"average\")\n",
    "evaluate(s_est, TARGET, \"skl_\" + sklearn.__version__, x_pca, y) \n",
    "print(\"scikit-learn AgglomerativeClustering train time: %.3f sec\" % train_time[3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.3 DBSCAN Clustering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frovedis DBSCAN train time: 1.588 sec\n",
      "scikit-learn DBSCAN train time: 44.054 sec\n"
     ]
    }
   ],
   "source": [
    "#Demo: DBSCAN Clustering\n",
    "import frovedis\n",
    "TARGET = \"dbscan\"\n",
    "from frovedis.exrpc.server import FrovedisServer\n",
    "FrovedisServer.initialize(\"mpirun -np 8 \" + os.environ[\"FROVEDIS_SERVER\"] )\n",
    "from frovedis.mllib.cluster import DBSCAN as frovDB\n",
    "f_est = frovDB(eps=4.52, metric=\"euclidean\", algorithm=\"brute\")\n",
    "\n",
    "# we are evaluating DBSCAN with first 50k samples due to memeory issue at Frovedis Server when trying with full data \n",
    "evaluate(f_est, TARGET, \"frov_\" + frovedis.__version__, X[:50000,:], y[:50000])  \n",
    "f_est.release()\n",
    "FrovedisServer.shut_down()\n",
    "print(\"Frovedis DBSCAN train time: %.3f sec\" % train_time[4])\n",
    "\n",
    "import sklearn\n",
    "from sklearn.cluster import DBSCAN as skDB\n",
    "s_est = skDB(eps=4.52, metric=\"euclidean\", algorithm=\"brute\", n_jobs=12)\n",
    "evaluate(s_est, TARGET, \"skl_\" + sklearn.__version__, X[:50000,:], y[:50000]) \n",
    "print(\"scikit-learn DBSCAN train time: %.3f sec\" % train_time[5])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <font color='green'> 4. Performance summary<font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>train time (sec)</th>\n",
       "      <th>homogeneity_score</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>algorithm</th>\n",
       "      <th>ml-framework</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">kmeans</th>\n",
       "      <th>frov_0.9.10</th>\n",
       "      <td>0.4934</td>\n",
       "      <td>0.490213</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>skl_0.24.1</th>\n",
       "      <td>1.6964</td>\n",
       "      <td>0.483556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">agglomerative</th>\n",
       "      <th>frov_0.9.10</th>\n",
       "      <td>16.7889</td>\n",
       "      <td>0.163916</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>skl_0.24.1</th>\n",
       "      <td>300.6783</td>\n",
       "      <td>0.163916</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">dbscan</th>\n",
       "      <th>frov_0.9.10</th>\n",
       "      <td>1.5884</td>\n",
       "      <td>0.185969</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>skl_0.24.1</th>\n",
       "      <td>44.0536</td>\n",
       "      <td>0.185466</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            train time (sec)  homogeneity_score\n",
       "algorithm     ml-framework                                     \n",
       "kmeans        frov_0.9.10             0.4934           0.490213\n",
       "              skl_0.24.1              1.6964           0.483556\n",
       "agglomerative frov_0.9.10            16.7889           0.163916\n",
       "              skl_0.24.1            300.6783           0.163916\n",
       "dbscan        frov_0.9.10             1.5884           0.185969\n",
       "              skl_0.24.1             44.0536           0.185466"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "index = pd.MultiIndex.from_tuples(list(zip(algo, ml_framework)), \n",
    "                                  names=[\"algorithm\", \"ml-framework\"])\n",
    "summary = pd.DataFrame(OrderedDict({ \"train time (sec)\": train_time, \n",
    "                                     \"homogeneity_score\": homogeneity\n",
    "                                  }), index=index)\n",
    "summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAGfCAYAAACdqpz+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABL50lEQVR4nO3dd5hdVfXG8e+bQg+hhQ5SpUOQSAdB6R1BuogiCAIiKAIKSFMR/ImiIqAiFpQuEAlFpApBSCBA6F1C0dAiASIkWb8/1r7kZpjAZHLmnpnJ+3mePLlzbttz5t5z1tl77bUVEZiZmZnZjOtTdwPMzMzMegsHVmZmZmYVcWBlZmZmVhEHVmZmZmYVcWBlZmZmVpF+dTcAYIEFFoilllqq7maYmZmZfaSRI0e+EhGD2ruvWwRWSy21FCNGjKi7GWZmZmYfSdJz07qv1qFASdtLOm/cuHF1NsPMzMysErUGVhExNCIOHDhwYJ3NMDMzM6uEk9fNzMzMKtItcqzMzMx6o/fee48xY8YwYcKEuptinTDbbLOx+OKL079//w4/x4GVmZlZFxkzZgwDBgxgqaWWQlLdzbHpEBG8+uqrjBkzhqWXXrrDz/NQoJmZWReZMGEC888/v4OqHkgS888//3T3NjqwMjMz60IOqnquzvztHFiZmZmZVcQ5VmZmZi1yZp9dKn29IyZfXunr2Yxzj5WZmVkv9cYbb3D22Wd36rnbbLMNb7zxRocff+WVV/Lwww+///MJJ5zAjTfe2Kn3/jARwac//Wn++9//VvJ6Y8eOZauttqrktcCBlZmZWa/1YYHVxIkTP/S5w4YNY5555unwe7UNrE4++WQ222yzDj+/o4YNG8Yaa6zB3HPPXcnrDRo0iEUWWYQ77rijkterdShQ0vbA9sstt1ydzTAzm25VD+m0koePZh7HHHMMTz31FIMHD2bzzTdn22235fjjj2feeefl0Ucf5fHHH2ennXbi+eefZ8KECRx++OEceOCBwJR1fMePH8/WW2/NhhtuyJ133sliiy3GVVddxeyzz/7++9x5551cffXV3HrrrZx66qlcfvnlnHLKKWy33XbsuuuuLLXUUuy5555ce+219OvXj/POO49jjz2WJ598kqOOOoqDDjoIgDPOOINLLrmE//3vf+y8886cdNJJH/idLrzwwvfb+NZbb7HbbrsxZswYJk2axPHHH8/uu+/OyJEjOfLIIxk/fjwLLLAAF1xwAYsssghPPvkkBx10EGPHjqVv375ceumlLLvssuy0005ceOGFbLDBBjO8z72kjZmZWS912mmnseyyyzJq1CjOOOMMAO69915++tOf8vjjjwNw/vnnM3LkSEaMGMFZZ53Fq6+++oHXeeKJJzjkkEN46KGHmGeeebj88qmD8/XXX58ddtiBM844g1GjRrHssst+4DWWXHJJRo0axUYbbcR+++3HZZddxl133cV3v/tdAG644QaeeOIJ7r77bkaNGsXIkSO57bbbPvA6d9xxB2uttRYA1113HYsuuij3338/o0ePZquttuK9997jsMMO47LLLmPkyJF86Utf4jvf+Q4Ae++9N4cccgj3338/d955J4sssggAQ4YM4fbbb+/sbp6Kk9fNzMxmImuvvfZUBS/POuss/vKXvwDw/PPP88QTTzD//PNP9Zyll16awYMHA7DWWmvx7LPPTvf77rDDDgCsttpqjB8/ngEDBjBgwABmnXVW3njjDW644QZuuOEG1lxzTQDGjx/PE088wcYbbzzV67z22msMGDDg/df6xje+wdFHH812223HRhttxOjRoxk9ejSbb745AJMmTWKRRRbhzTff5IUXXmDnnXcGsqp6w4ILLsiLL7443b9TexxYmZmZzUTmnHPO92/fcsst3HjjjQwfPpw55piDTTbZpN2CmLPOOuv7t/v27cs777wz3e/beI0+ffpM9Xp9+vRh4sSJRATHHnssX/nKVz70dfr168fkyZPp06cPH//4x7n33nsZNmwYxx13HJ/5zGfYeeedWWWVVRg+fPhUz3vzzTen+ZoTJkyYamhzRjiwMjMza5FW57cNGDDgQwOKcePGMe+88zLHHHPw6KOPctddd3XZe32ULbfckuOPP569996bueaaixdeeIH+/fuz4IILTvW4FVZYgaeffprllluOF198kfnmm4999tmHeeaZh1//+tccc8wxjB07luHDh7Peeuvx3nvv8fjjj7PKKquw+OKLc+WVV7LTTjvxv//9j0mTJjHHHHPw+OOPs+qqq3a67c08K9DMzKyXmn/++dlggw1YddVVOeqooz5w/1ZbbcXEiRNZaaWVOOaYY1h33XU7/V577LEHZ5xxBmuuuSZPPfXUdD9/iy22YK+99mK99dZjtdVWY9ddd203UNt2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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_graph = summary.plot.bar(y=0, rot=45, figsize=(10,5), log=True, colormap=\"PiYG\", \\\n",
    "                               xlabel=\"frovedis vs sklearn clustering algorithm performance\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlMAAAGfCAYAAAB7g1e6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABNQUlEQVR4nO3dd5xcVfnH8c83jQCB0ALSiyAdAkR6VapK76AQBCnSURFUEClSbWj8ISggTXoJTVDpUhMIvTcJgoYqLUDI8/vjOZNMlk2y2bs7s7v5vl+vvDJz587M2TMz9z73nOeco4jAzMzMzNqnV7MLYGZmZtadOZgyMzMzq8DBlJmZmVkFDqbMzMzMKnAwZWZmZlZBn2a98VxzzRWLLLJIs97ezMzMrM1Gjhz5RkQMau2xpgVTiyyyCCNGjGjW25uZmZm1maSXJ/eYu/nMzMzMKnAwZWZmZlaBgykzMzOzCtqUMyVpU+A3QG/gjxFxUovHhwKnAq+WTb+LiD92YDnNzMw6xaeffsro0aMZO3Zss4tiXUD//v1ZYIEF6Nu3b5ufM9VgSlJvYBiwETAaeEDS8Ih4osWul0TEAdNSYDMzs2YbPXo0s8wyC4sssgiSml0ca6KI4M0332T06NEsuuiibX5eW7r5VgWei4gXIuIT4GJgy3aW08zMrEsZO3Ysc845pwMpQxJzzjnnNLdStiWYmh94pe7+6LKtpW0lPSLpckkLTqaQe0saIWnEmDFjpqmgZmZmncWBlNW057vQUQno1wKLRMQKwN+AP7e2U0ScGRFDImLIoEGtzntlZmZm1q20JQH9VaC+pWkBJiaaAxARb9bd/SNwSvWimZmZNd4xa8/Ysa9310cd+nrW9bSlZeoBYAlJi0rqB+wEDK/fQdK8dXe3AJ7suCKamZn1bC+99BLLLbdcs4vRodZcc00g/7aLLrqoyaXpXFMNpiJiHHAAcBMZJF0aEY9LOlbSFmW3gyQ9Lulh4CBgaGcV2MzMzLq+u+++G+hawdS4ceM65XXbNM9URNwA3NBi29F1t48EjuzYorVfRzfRNpKbg83Mpk+fffYZ3/nOd7j77ruZf/75ueaaa3j66afZd999+fDDD/niF7/I2Wefzeyzz87666/PSiutxJ133skHH3zAeeedx4knnsijjz7KjjvuyPHHHw/AL3/5S84++2wA9tprLw455BAAjjvuOC644AIGDRrEggsuyCqrrML3v/99nn/+efbff3/GjBnDTDPNxFlnncVSSy3F0KFDmXXWWRkxYgSvv/46p5xyCttttx0Ap556Kpdeeikff/wxW2+9NT/72c8AGDBgAO+//z5HHHEETz75JIMHD2b33Xfnqquu4vTTT2fw4MEArL322gwbNowVV1zxc3Vy++23c/DBBwOZGH7HHXcwyyyzcPLJJ3PBBRfQq1cvNttsM0466SRGjRo12boaPHgwd911FzvvvDPrr78+hx12GO+//z5zzTUX5557LvPOO+/n3ntaeAZ0MzOzLuDZZ59l//335/HHH2e22WbjiiuuYLfdduPkk0/mkUceYfnll58QqAD069ePESNGsO+++7LlllsybNgwHnvsMc4991zefPNNRo4cyTnnnMN9993Hvffey1lnncVDDz3EAw88wBVXXMHDDz/MjTfeyIgRIya85t57781vf/tbRo4cyWmnncZ3v/vdCY+99tpr3HXXXVx33XUcccQRANx88808++yz3H///YwaNYqRI0dyxx13TPJ3nXTSSayzzjqMGjWKQw89lD333JNzzz0XgGeeeYaxY8e2GkgBnHbaaQwbNoxRo0Zx5513MuOMM3LjjTdyzTXXcN999/Hwww9z+OGHA0yxrj755BNGjBjBQQcdxIEHHsjll1/OyJEj+fa3v82Pf/zjah8cbWyZMjMzs8616KKLTmitWWWVVXj++ed55513WG+99QDYfffd2X777Sfsv8UWmWmz/PLLs+yyy05oXVlsscV45ZVXuOuuu9h6662ZeeaZAdhmm2248847GT9+PFtuuSX9+/enf//+bL755gC8//773H333ZO8x8cffzzh9lZbbUWvXr1YZpll+M9//gNkMHXzzTez0korTXiNZ599lnXXXXeyf+f222/Pcccdx6mnnsrZZ5/N0KFDJ7vvWmutxWGHHcauu+7KNttswwILLMDf//539thjD2aaaSYA5phjDt59990p1tWOO+4IwNNPP81jjz3GRhttBGRrYNVWKXAwZWZm1iXMMMMME2737t2bd955p0379+rVa5Ln9urVq125QePHj2e22WZj1KhRUy1fREz4/8gjj2SfffZp8/vMNNNMbLTRRlxzzTVceumljBw5crL7HnHEEXz961/nhhtuYK211uKmm25q8/vUqwWUEcGyyy7LPffc067XmRwHU9YhnKdmZj1FVzkmDBw4kNlnn50777yTddZZh/PPP39Cy0tbrLPOOgwdOpQjjjiCiOCqq67i/PPPZ9y4ceyzzz4ceeSRjBs3juuuu469996bWWedlUUXXZTLLruM7bffnojgkUcemWwXHMAmm2zCUUcdxa677sqAAQN49dVX6du3L3PPPfeEfWaZZRbee++9SZ631157sfnmm7POOusw++yzT/b1n3/+eZZffnmWX355HnjgAZ566ik22mgjjj32WHbddVdmmmkm3nrrLeaYY4421dWSSy7JmDFjuOeee1hjjTX49NNPeeaZZ1h22WXbXK+tcTBlZmbWRf35z3+ekFS92GKLcc4557T5uSuvvDJDhw5l1VVXBTKAqXXHbbHFFqywwgrMM888LL/88gwcOBCACy+8kP3224/jjz+eTz/9lJ122mmKwdTGG2/Mk08+yRprrAFk0vkFF1wwSTC1wgor0Lt3b1ZccUWGDh3KoYceyiqrrMKss87KHnvsMcW/4de//jW33norvXr1Ytlll2WzzTZjhhlmYNSoUQwZMoR+/frxta99jZ///Odtqqt+/fpx+eWXc9BBB/Huu+8ybtw4DjnkkMrBlGpNdY02ZMiQqE9660huJWk817mZdVdPPvkkSy+9dLOL0VDvv/8+AwYM4MMPP2TdddflzDPPZOWVV27Y+//73/9m/fXX56mnnqJXr643Fq6174SkkRExpLX9u95fYGZmZp1q7733ZvDgway88spsu+22DQ2kzjvvPFZbbTVOOOGELhlItYe7+czMzKYzzZxEc7fddmO33XabZNs555zDb37zm0m2rbXWWgwbNqyRRWs3B1NmZjbdiwgkNbsY06099thjqvlTjdKe9Kee0b5mZmbWTv379+fNN99s10nUepaI4M0336R///7T9Dy3TJmZ2XRtgQUWYPTo0YwZM6bZRbEuoH///iywwALT9BwHU2ZmNl3r27cviy66aLOLYd2Yu/nMzMzMKnAwZWZmZlaBgykzMzOzChxMmZmZmVXgYMrMzMysAgdTZmZmZhU4mDIzMzOrwMGUmZmZWQUOpszMzMwqcDBlZmZmVoGDKTMzM7MKHEyZmZmZVeBgyszMzKwCB1NmZmZmFTiYMjMzM6vAwZSZmZlZBQ6mzMzMzCpwMGVmZmZWgYMpMzMzswocTJmZ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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "score_graph = summary.plot.bar(y=1, rot=45, figsize=(10,5), colormap=\"PuOr\", \\\n",
    "                              xlabel=\"frovedis vs sklearn clustering algorithm score\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
